<?php

namespace app\common\controller;


use think\Request;

final class SlideCode
{
    private static $baseUrl = 'https://liande.oss-cn-beijing.aliyuncs.com/';

    public static function index()
    {
        $data = input();
        $type = $data['type'];
        if ($type === 'shengcheng') {
            //生成
            //【随机】裁剪的区域坐标【左上角】【并保存】
            $data = [
                'status' => 0,                                                //验证是否通过[0=未通过,1=通过]
                'xaxis' => rand(130, 550),                                    //水平
                'yaxis' => rand(50, 260),
                'img_url' => '/hongming/slide_code/zhutu/' . rand(1, 61) . '.jpg',            //原图要求是 1920x1080这个比例的，实际尺寸为679x382就可以了【图片避免用白色背景的】
                'moban' => '/hongming/slide_code/futu/' . rand(1, 4) . '.png',
                'opacity' => rand(20, 50),                                    //原图上空缺的位置的透明度【这个可以增加被破解的记录】
//                'time' => time() + 600,                                    //设置失效时间 600=10分钟
                'error_num' => 2,                                                //验证图形验证码时，错误次数不能超过2次
//                'success_cishu' => 0                                                //图形验证码，已经成功使用了n次
            ];

            $res = \app\common\model\SlideCode::create($data);
            if ($res->id <= 0) {
                return ['code' => 0, 'msg' => '图形滑动验证码生成失败'];
            }

            return ['code' => 1, 'data' => $res->id];

        } else if ($type === 'yanzheng') {
            //验证
            $id = $data['id'];
            $info = \app\common\model\SlideCode::find($id);

            if (!$info) {
                return ['code' => 0, 'msg' => '图形滑动验证码尚未生成'];
            }
            $xaxis = $data['x'];
            Log::insertLog($xaxis);
            Log::insertLog($info['xaxis']);
            if ($xaxis < $info['xaxis'] - 40 || $xaxis > $info['xaxis'] + 40) {
                return ['code' => 0, 'msg' => '验证失败'];
            };

            return ['code' => 1, 'msg' => '验证成功'];

        } else {
            //加载主图 跟 缺口图
            $id = $data['id'];
            $info = \app\common\model\SlideCode::find($id);

            if (!$info) {
                return ['code' => 0, 'msg' => '图形滑动验证码尚未生成'];
            }

            //创建源图的实例
            $src = imagecreatefromstring(file_get_contents(self::$baseUrl . $info->img_url));
            //新建一个真彩色图像【尺寸 = 90x90】【目前是不透明的】
            $res_image = imagecreatetruecolor(90, 90);
            //创建透明背景色，主要127参数，其他可以0-255，因为任何颜色的透明都是透明
            $transparent = imagecolorallocatealpha($res_image, 255, 255, 255, 127);
            //指定颜色为透明（做了移除测试，发现没问题）
            imagecolortransparent($res_image, $transparent);
            //填充图片颜色【填充会将相同颜色值的进行替换】
            imagefill($res_image, 0, 0, $transparent);//左边的半圆
            //实现两个内凹槽【填补上纯黑色】
            @$tempImg = imagecreatefrompng(self::$baseUrl . $info->moban);//加载模板图。主要该处在php的高版本会报一个error，但错误并不会影响程序执行。所以屏蔽了就行
            for ($i = 0; $i < 90; $i++) {// 遍历图片的像素点
                for ($j = 0; $j < 90; $j++) {
                    if (imagecolorat($tempImg, $i, $j) !== 0) {// 获取模板上某个点的色值【取得某像素的颜色索引值】【0 = 黑色】
                        $rgb = imagecolorat($src, $info->xaxis + $i, $info->yaxis + $j);// 对应原图上的点
                        imagesetpixel($res_image, $i, $j, $rgb);// 移动到新的图像资源上
                    }
                }
            }
            if ($type === 'zhutu') {
                //制作一个半透明白色蒙版
                $mengban = imagecreatetruecolor(90, 90);
                //先让蒙版变成透明的
                //指定颜色为透明（做了移除测试，发现没问题）
                imagecolortransparent($mengban, $transparent);
                //填充图片颜色【填充会将相同颜色值的进行替换】
                imagefill($mengban, 0, 0, $transparent);
                $huise = imagecolorallocatealpha($res_image, 255, 255, 255, 20);
                for ($i = 0; $i < 90; $i++) {// 遍历图片的像素点
                    for ($j = 0; $j < 90; $j++) {
                        $rgb = imagecolorat($res_image, $i, $j); // 获取模板上某个点的色值【取得某像素的颜色索引值】
                        if ($rgb !== 2147483647) {// 获取模板上某个点的色值【取得某像素的颜色索引值】【0 = 黑色】
                            imagesetpixel($mengban, $i, $j, $huise);// 对应点上画上黑色
                        }
                    }
                }
                //把修改后的图片，放回原本的位置
                imagecopyresampled(
                    $src,//裁剪后的存放图片资源
                    $res_image,//裁剪的原图资源
                    $info->xaxis, $info->yaxis,//存放的图片，开始存放的位置
                    0, 0,//开始裁剪原图的位置
                    90, 90,//存放的原图宽高
                    90, 90//裁剪的原图宽高
                );
                //把蒙版添加到原图上去
                imagecopyresampled(
                    $src,//裁剪后的存放图片资源
                    $mengban,//裁剪的原图资源
                    $info->xaxis + 1, $info->yaxis + 1,//存放的图片，开始存放的位置
                    0, 0,//开始裁剪原图的位置
                    90 - 2, 90 - 2,//存放的原图宽高
                    90, 90//裁剪的原图宽高
                );
//                header('Content-Type: image/jpeg');
                $nurl = self::makePic('.jpg');
                imagejpeg($src, $nurl);//浏览器 输出图片[输出jpg可以大幅度减少图片大小]
                imagedestroy($res_image);
                imagedestroy($mengban);
                return ['code' => 1, 'data' => $nurl];

            } elseif ($type === 'futu') {
                //补上白色边框
                @$tempImg = imagecreatefrompng(self::$baseUrl . $info->moban);//加载模板图
                $white = imagecolorallocatealpha($res_image, 255, 255, 255, 1);
                for ($i = 0; $i < 90; $i++) {// 遍历图片的像素点
                    for ($j = 0; $j < 90; $j++) {
                        if (imagecolorat($tempImg, $i, $j) === 0) {// 获取模板上某个点的色值【取得某像素的颜色索引值】【0 = 黑色】
                            imagesetpixel($res_image, $i, $j, $white);// 对应点上画上黑色
                        }
                    }
                }

                //创建一个90x382宽高 且 透明的图片
                $res_image2 = imagecreatetruecolor(90, 382);
                //指定颜色为透明（做了移除测试，发现没问题）
                imagecolortransparent($res_image2, $transparent);
                //填充图片颜色【填充会将相同颜色值的进行替换】
                imagefill($res_image2, 0, 0, $transparent);//左边的半圆
                //把裁剪的图片，移到新图片上
                imagecopyresampled(
                    $res_image2,//裁剪后的存放图片资源
                    $res_image,//裁剪的原图资源
                    0, $info->yaxis,//存放的图片，开始存放的位置
                    0, 0,//开始裁剪原图的位置
                    90, 90,//存放的原图宽高
                    90, 90//裁剪的原图宽高
                );
//                header('Content-Type: image/png');
                $nurl = self::makePic('.png');
                imagepng($res_image2, $nurl);//浏览器 输出图片[输出jpg可以大幅度减少图片大小]
                imagedestroy($res_image);
                imagedestroy($res_image2);
                return ['code' => 1, 'data' => $nurl];
            }
        }
    }

    /**
     * 生成图片url地址
     * @return string
     */
    private static function makePic($type = '.jpg')
    {
        $date = date('Ymd', time());
        $dirname = 'uploads/picture/' . $date;
//        var_dump($dirname);die;
        if (!is_dir($dirname)) {
            mkdir($dirname);
            chmod($dirname, 0777);
        }
        $basename = md5(time()) . $type;
        return $dirname . '/' . $basename;
    }
}